//MIT License
//
//Copyright(c) 2020 Goodman Tao
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files(the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions :
//
//The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE.


#include <stdlib.h>
#include <stdio.h>
#include "../__include/_LB_1_MemoryManager.h"

#include "ActorController.h"
#include "IBuilderActor.h"
#include "BuilderHero.h"
#include "BuilderAngel.h"
#include "BuilderDevil.h"

int main(int argc, char **argv)
{
    __MEMS();

	bool bRet = false;

	//IBuilderActor *pBuilder = __Cvt(__SNEW(BuilderHero), __TYPE(IBuilderActor));
	//IBuilderActor *pBuilder = __Cvt(__SNEW(BuilderAngel), __TYPE(IBuilderActor));
	IBuilderActor *pBuilder = __Cvt(__SNEW(BuilderDevil), __TYPE(IBuilderActor));

    ActorController *pController = __SNEW(ActorController);
	Actor *pActor = NULL;
    pController->Call(pController, "Construct", &pActor, pBuilder, &bRet); __MEMI(pActor, pActor->Destroy);

    char* pDesc = NULL; __MEMI2(&pDesc, free);
	pActor->Call(pActor, "GetType", &pDesc, &bRet);
	printf("%s\n", pDesc);
	free(pDesc); pDesc = NULL;
	pActor->Call(pActor, "GetGender", &pDesc, &bRet);
	printf("%s\n", pDesc);
	free(pDesc); pDesc = NULL;
	pActor->Call(pActor, "GetFace", &pDesc, &bRet);
	printf("%s\n", pDesc);
	free(pDesc); pDesc = NULL;
	pActor->Call(pActor, "GetCostume", &pDesc, &bRet);
	printf("%s\n", pDesc);
	free(pDesc); pDesc = NULL;
	pActor->Call(pActor, "GetHairStyle", &pDesc, &bRet);
	printf("%s\n", pDesc);

    __MEMT();
	return 0;
}